In computer architecture, a superscalar computer, i.e., a computer with multiple processing components that may execute more than one instruction per clock cycle, may be used for high-level, computation-intensive applications. Often, superscalar computers will employ one or more pipeline processors that may be used for low-level instruction “crunching” to better handle certain computationally-intensive processes. In the hierarchy of computer programming, such processes may be implemented as a set of instructions that are part of a sub-program called an instruction branch or more simply, a branch. In this manner, a branch may or may not be executed depending on the execution of various aspects of the overall program. In an effort to assist with such computationally-intensive branches, sometimes instructions for a branch are executed ahead of the time when they may be encountered during the execution of a program. A branch predictor may be part of a pipeline processor, or may work in concert with a pipeline processor and may help determine whether a conditional branch in a computer program is likely to be taken or not.
Predicting whether or not to execute a branch in advance is often called branch prediction. Branch predictors are prevalent in today's modern, superscalar processors for achieving better performance. An effective branch predictor allows a processor to fetch and execute a set of instructions without first waiting for a branch to be executed or resolved. Many pipelined processors perform branch prediction of some form because execution time may be saved by starting the execution of complex branches ahead of time using unallocated computational resources (i.e., the pipeline). By predicting correctly that a branch will be executed when an operating program reaches a branch allows time to be saved as unallocated computing power is engaged sooner rather than later. As such, it may be advantageous for any branch predictor to be as accurate as possible. That is, it is a waste of computational time and power to begin executing a set of instructions in a branch that is ultimately not taken such that any pipeline processor that begins executing a branch that is ultimately not taken may have to flush (i.e. delete) its computations. That is, such advance execution of instructions in a branch not taken typically provides no useful end.